fn main() {
    let mut s = String::from("hello");

    // 同一可变变量指针，在不同作用域，可以分别被借用一次
    change(&mut s);
    change(&mut s);

    // 不可变变量指针，可被重复借用
    let t1 = &s;
    let t2 = &s;
    println!("{:?} {:?}", t1, t2); // t2 会报重复借用的错误

    // 不可变变量指针，可被重复借用
    let s1 = concat2(&s, &s);
    println!("{s1}");


    // 同一作用域，同一可变变量指针只能被借用一次
    let t1 = &mut s;
    let t2 = &mut s; // t2 会报重复借用的错误
    println!("{:?} {:?}", t1, t2);

    // 同上
    concat(&mut s, &mut s); // str2 参数会报重复借用的错误

    println!("{}", s);
}

fn change(some_string: &mut String) {
    some_string.push_str(", world");
}

fn concat(str1: &mut String, str2: &mut String) {
    str1.push_str(&str2);
}

fn concat2(str1: &String, str2: &String) -> String {
    let mut s = String::from(str1);
    s.push_str(str2);
    s
}